"""

"""
import sys

'''
函数默认参数
'''


def get_sum(a, b):
    if isinstance(a, int) and isinstance(b, int):
        return a + b
    else:
        return '请输入整数'


print(get_sum(1, 2))
print(get_sum(1.1, 2.2))


def get_sum2(a, b=0):
    if isinstance(a, int) and isinstance(b, int):
        return a + b
    else:
        return '请输入整数'


print(get_sum2(4))
print(get_sum2(4, 5))


def borrow_book(book_name, username, number=1, school='中国科学技术大学'):
    print('用户%s在%s借了%s%s本' % (username, school, book_name, number))


borrow_book('《Python从入门到放弃》', '张三')
borrow_book('《Python从入门到放弃》', '张三', 2)
borrow_book('《Python从入门到放弃》', '张三', 2, '清华大学')
borrow_book('《Python从入门到放弃》', '张三', school='清华大学')  # 通过关键字参数赋值，跳过中间的参数。
borrow_book(book_name='《Python从入门到放弃》', username='张三', number=2, school='清华大学')
borrow_book(username='张三', book_name='《Python从入门到放弃》', number=2, school='清华大学')

'''
装包
'''
a, *b, c = 1, 2, 3, 4, 5
print(a, b, c)
a, b, *c = 1, 2, 3, 4, 5
print(a, b, c)

'''
拆包
'''
a, b, c = [1, 2, 3]
print(a, b, c)
a, b, c = (1, 2, 3)
print(a, b, c)
'''
拆包+装包
'''
a, b, *c = (1, 2, 3, 4, 5)
print(a, b, c)

'''
可变参数:
    *args
    **kwargs：调用的时候，必须传递关键字参数，才可以放入字典中。
'''


def get_sum_1(*arg):
    print(arg)
    sum_ = 0
    for i in arg:
        sum_ += i
    print(sum_)


get_sum_1()  # 装包
get_sum_1(1)  # 装包
get_sum_1(1, 2)  # 装包
get_sum_1(1, 2, 3)  # 装包

sum((1, 2, 3))

get_sum_1(*(1, 2, 3, 4))  # 拆包+装包


def show_book(**aa):  # 拆包
    print(aa)


show_book(name='《Python从入门到放弃》', author='张三')  # 装包
show_book(name='《Python从入门到放弃》', author='张三', price=100)  # 装包
show_book(**{'name': '《Python从入门到放弃》', 'author': '张三'})  # 拆包+装包


def show_book_1(*args, **kwargs):
    print(args)
    print(kwargs)


show_book_1()
show_book_1(1, 2)
show_book_1(1, 2, 3, )
show_book_1(1, 2, 3, name='《Python从入门到放弃》', author='张三')

print('{}{}{name}{}'.format('aaa', 'bbb', 'ddd', name='ccc'))

'''
返回多个参数
'''


def get_max_min(*arg):
    return max(arg), min(arg)


aa, bb = get_max_min(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(aa, bb)
'''
可变与不可变：
    不可变：当改变变量的值时，地址发生了改变。类型：int str float bool tuple。
    可变：里面内容发生了改变，但是地址没有发生改变。类型：list set dict
从本质上来说：
    不可变指的是堆内存中的的内容是固定的，不能发生变化。
    可变指的是堆内存中的内容不是固定的，可以发生变化。
基本上就可以理解为，内存中保存的是基本类型，那就不可变，保存的是引用，那就可变。
'''

a_1 = 2  # 全局变量。函数内部可以直接使用全局变量，但是不能直接修改，需要用 global 声明一下全局变量才行。


def get_value():
    # a_1+=1
    # a_1=a_1+1
    # a1=a_1
    # a1+=1
    print(a_1)


get_value()


def set_value():
    global a_1  # 全局变量，在函数内部修改，需要加 global。
    a_1 = 100


set_value()
print(a_1)


def function_description(a, b):
    """
    函数的注释
    :param a: 参数 1
    :param b: 参数 2
    :return: 返回结果
    """
    return a, b, a + b, a, b


print(function_description.__doc__)


def function_description_1(a, b):
    '简单的函数注释'
    print(sys.getrefcount(a))
    a = 'zyx'
    print(sys.getrefcount(a))
    return a, b


def t(l):
    print(sys.getrefcount(l))
    if isinstance(l, list):
        print(l)


ll = [1, 2]
t(ll)

str_1 = 'zzz'
function_description_1(str_1, 2)
print(sys.getrefcount(a_1))
